package jp.seraph.jsade.core;

import java.util.List;

import jp.seraph.jsade.effector.EffectorBuilder;
import jp.seraph.jsade.math.Angle;
import jp.seraph.jsade.math.AngleVelocity;
import jp.seraph.jsade.model.AngleVelocityCalculator;
import jp.seraph.jsade.model.ForceResistance;
import jp.seraph.jsade.model.GyroValue;
import jp.seraph.jsade.model.Joint;
import jp.seraph.jsade.model.JointIdentifier;
import jp.seraph.jsade.model.ModelObjectIdentifier;
import jp.seraph.jsade.model.ModelPart;

/**
 * サッカーサーバ上の自プレイヤーを表すインターフェース。<br>
 * Agent実装は基本的にこのインターフェースのインスタンスを使用してエージェントの動作を設定する。
 */
public interface Player extends EffectorBuilder {
    /**
     * 対象ジョイントの角度を返します。
     * 
     * @param aID
     * @return
     */
    public Angle getJointAngle(JointIdentifier aID);

    /**
     * 対象ジョイントの角速度を返します。
     * 
     * @param aID
     * @return
     */
    public AngleVelocity getJointAngleVelocity(JointIdentifier aID);

    /**
     * 対象ジョイントの角度をaTargetAngleにするように、各速度を設定します。
     * 
     * @param aID
     * @param aTargetAngle
     * @return 設定された角速度
     */
    public AngleVelocity setJointAngle(JointIdentifier aID, Angle aTargetAngle);

    /**
     * 角速度計算機を指定して、ジョイントの角度をaTargetAngleにするように、角速度を設定します。
     * 
     * @param aID
     * @param aTargetAngle
     * @param aCalculator
     *            角速度計算機
     * @return 設定された角速度
     */
    public AngleVelocity setJointAngle(JointIdentifier aID, Angle aTargetAngle, AngleVelocityCalculator aCalculator);

    /**
     * 対象ジョイントの各速度をaAngleVelocityに設定します。
     * 
     * @param aID
     * @param aAngleVelocity
     * @return 設定された角速度
     */
    public AngleVelocity setJointAngleVelocity(JointIdentifier aID, AngleVelocity aAngleVelocity);

    /**
     * 対象ジョイントを取得する
     * 
     * @param aID
     * @return
     */
    public Joint getJoint(JointIdentifier aID);

    /**
     * このプレイヤーが保持するすべてのジョイントを取得する
     * 
     * @return
     */
    public List<Joint> getAllJoints();

    /**
     * 対象のオブジェクトを取得する
     * 
     * @param aID
     * @return
     */
    public ModelPart getObject(ModelObjectIdentifier aID);

    /**
     * このプレイヤーが保持するすべてのオブジェクトを取得する
     * 
     * @return
     */
    public List<ModelPart> getAllObjects();

    /**
     * 現在のジャイロの値を取得する
     * 
     * @return
     */
    public GyroValue getGyroValue();

    /**
     * 今までのジャイロの値を足し合わせたものを取得する。
     * 
     * @return
     */
    public GyroValue getTotalGyroValue();

    /**
     * 左足のセンサが取得した抵抗力を返す。 今後、センサが両足以外についた場合、このメソッドは廃止される可能性があります。
     * 
     * @return
     */
    public ForceResistance getLeftFootForceResistance();

    /**
     * 左足のセンサが取得した抵抗力を返す。 今後、センサが両足以外についた場合、このメソッドは廃止される可能性があります。
     * 
     * @return
     */
    public ForceResistance getRightFootForceResistance();
}
